 /*******************************************************************************
  * Copyright (c) 2004, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.presentations.defaultpresentation;

 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.RGB;
 import org.eclipse.ui.internal.IWorkbenchThemeConstants;
 import org.eclipse.ui.internal.preferences.AbstractPropertyListener;
 import org.eclipse.ui.internal.preferences.IPropertyMap;
 import org.eclipse.ui.internal.preferences.PropertyUtil;
 import org.eclipse.ui.internal.themes.LightColorFactory;
 import org.eclipse.ui.presentations.StackPresentation;

 /**
  * @since 3.1
  */
 public class DefaultThemeListener extends AbstractPropertyListener {

     private DefaultTabFolder folder;
     private IPropertyMap theme;
     
     public DefaultThemeListener(DefaultTabFolder folder, IPropertyMap theme) {
         this.folder = folder;
         this.theme = theme;
     }
     
     private Color getColor(String id, Color defaultValue) {
         Color value = (Color)theme.getValue(id, Color.class);
         if (value == null) {
             value = defaultValue;
         }
         
         return value;
     }
     
     private int getInt(String id, int defaultValue) {
         Integer result = ((Integer )theme.getValue(id, Integer .class));
         
         if (result == null) {
             return defaultValue;
         }
         
         return result.intValue();
     }
     
     private boolean getBoolean(String id, boolean defaultValue) {
         Boolean result = ((Boolean )theme.getValue(id, Boolean .class));
         
         if (result == null) {
             return defaultValue;
         }
         
         return result.booleanValue();
     }

     /*
      * Update the ACTIVE_TAB_HIGHLIGHT_START color in the color registry.
      * Return true if we're using highlights on tabs, false otherwise.
      * The highlight color is computed based on the ACTIVE_TAB_BG_START.
      * We need to do this here, in the ThemeListener, so that we can catch
      * the change to the ACTIVE_TAB_BG_START begin color and update the
      * highlight color appropriately.
      * @return boolean use highlight color
      */
     private boolean updateHighlightColor() {
         if(! useHighlight())
             return false;
         //get newTabBegin from theme, not from ColorRegistry, which may not have been updated yet
 RGB newTabBegin = getColor(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START, null).getRGB();
         RGB newHighlight = LightColorFactory.createHighlightStartColor(newTabBegin);
         //Registry handles lifecycle of colors so no leakage and if RGB s.equals then no change
 JFaceResources.getColorRegistry().put(IWorkbenchThemeConstants.ACTIVE_TAB_HIGHLIGHT_START, newHighlight);
         return true;
     }
     
     private boolean useHighlight() {
         return PropertyUtil.get(
                 this.theme,
                 IWorkbenchThemeConstants.ACTIVE_TAB_HIGHLIGHT,
                 false);
     }
     
     public void update() {
         Color[] activeFocusBackgroundColors = updateHighlightColor()
             ? new Color[] {
                 getColor(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START, null),
                 getColor(IWorkbenchThemeConstants.ACTIVE_TAB_BG_END, null),
                 JFaceResources.getColorRegistry().get(IWorkbenchThemeConstants.ACTIVE_TAB_HIGHLIGHT_START)
                 }
             : new Color[] {
                 getColor(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START, null),
                 getColor(IWorkbenchThemeConstants.ACTIVE_TAB_BG_END, null)
                 };
         
         folder.setColors(new DefaultTabFolderColors(
                 getColor(IWorkbenchThemeConstants.ACTIVE_TAB_TEXT_COLOR, null),
                 activeFocusBackgroundColors,
                 new int[] {
                         getInt(IWorkbenchThemeConstants.ACTIVE_TAB_PERCENT, 0) },
                         getBoolean(IWorkbenchThemeConstants.ACTIVE_TAB_VERTICAL, true)),
                         StackPresentation.AS_ACTIVE_FOCUS, true);
         
         folder.setColors(new DefaultTabFolderColors(
                 getColor(IWorkbenchThemeConstants.ACTIVE_NOFOCUS_TAB_TEXT_COLOR, null),
                 new Color[] {
                         getColor(IWorkbenchThemeConstants.ACTIVE_NOFOCUS_TAB_BG_START, null),
                         getColor(IWorkbenchThemeConstants.ACTIVE_NOFOCUS_TAB_BG_END, null)
                         },
                 new int[] {
                         getInt(IWorkbenchThemeConstants.ACTIVE_NOFOCUS_TAB_PERCENT, 0) },
                         getBoolean(IWorkbenchThemeConstants.ACTIVE_NOFOCUS_TAB_VERTICAL, true)),
                         StackPresentation.AS_ACTIVE_FOCUS, false);
         
         folder.setColors(new DefaultTabFolderColors(
                 getColor(IWorkbenchThemeConstants.INACTIVE_TAB_TEXT_COLOR, null),
                 new Color[] {
                         getColor(IWorkbenchThemeConstants.INACTIVE_TAB_BG_START, null),
                         getColor(IWorkbenchThemeConstants.INACTIVE_TAB_BG_END, null) },
                 new int[] {
                         getInt(IWorkbenchThemeConstants.INACTIVE_TAB_PERCENT, 0) },
                         getBoolean(IWorkbenchThemeConstants.INACTIVE_TAB_VERTICAL, true)),
                         StackPresentation.AS_INACTIVE);
         
         folder.setColors(new DefaultTabFolderColors(
                 getColor(IWorkbenchThemeConstants.INACTIVE_TAB_TEXT_COLOR, null),
                 new Color[] {
                         getColor(IWorkbenchThemeConstants.INACTIVE_TAB_BG_START, null) },
                 new int[0],
                 true), StackPresentation.AS_ACTIVE_NOFOCUS);
         
         folder.setFont((Font)theme.getValue(IWorkbenchThemeConstants.TAB_TEXT_FONT, Font.class));
     }

 }

